package com.lagou.edu.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

/**
 * @author 赵虎
 * @date 2021/3/24 1:14 下午
 */
@Component
public class RedisClusterConfig {

    @Autowired
    private JedisProperties jedisProperties;


    //可用连接实例的最大数目，默认为8；
    //如果赋值为-1，则表示不限制，如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)
    private static final Integer MAX_TOTAL = 1024;
    //控制一个pool最多有多少个状态为idle(空闲)的jedis实例，默认值是8
    private static final Integer MAX_IDLE = 200;
    //等待可用连接的最大时间，单位是毫秒，默认值为-1，表示永不超时。
    //如果超过等待时间，则直接抛出JedisConnectionException
    private static final Integer MAX_WAIT_MILLIS = 10000;

    @Bean
    public JedisCluster jedisCluster() {
        JedisPoolConfig config = new JedisPoolConfig();

        config.setMaxTotal(MAX_TOTAL);
        config.setMaxIdle(MAX_IDLE);
        config.setMaxWaitMillis(MAX_WAIT_MILLIS);
        //如果为true，则得到的jedis实例均是可用的
        config.setTestOnBorrow(true);
        //在空闲时检查有效性, 默认false
        config.setTestWhileIdle(true);
        //是否进行有效性检查
        config.setTestOnReturn(true);

        Set<HostAndPort> jedisClusterNode = new HashSet<>();

        for (String uri : jedisProperties.getUri()) {
            String[] uriArr = uri.split(":");
            jedisClusterNode.add(new HostAndPort(uriArr[0], Integer.parseInt(uriArr[1])));
        }

        return new JedisCluster(jedisClusterNode, 1000, 1000, 5, config);
    }
}
